GraphQL ServerのCode frist→ Schema first→ Code firstの遍歴
GraphQLを実装する際の手法に移り変わりがある
第1世代: Code First(graphql-js)
2015~
2016~
2018~
時期も割と重要mrsekut.icon
他の選択肢があるよとも書かれていない(Code Firstという単語は出てこない)
参考
第1世代: Code First(graphql-js)
GraphQLがリリースされた2015年辺りの話
例
code:Js
const schema = new GraphQLSchema({
query: new GraphQLObjectType({
name: 'Query',
fields: {
hello: {
type: GraphQLString,
args: {
name: { type: GraphQLString },
},
resolve: (_, args) => Hello ${args.name || 'World!'},
},
},
}),
})
Schemaの定義を素のJSのobjectで書いている
定義を書くのが冗長で大変
Schemaの定義と、実装を分離する
第1世代のものが冗長さに比較して、Schemaの定義は簡素
例
code:ts
const typeDefs = `
type Query {
hello(name: String): String
}
`
const resolvers = {
Query: {
hello: (_, args) => Hello ${args.name || 'World!'},
},
}
const schema = makeExecutableSchema({
typeDefs,
resolvers,
})
型とresolverを定義して、Schemaを作る
規模が大きくなってくると大変
ツールを組み合わせることで解決できるが、ツールの数が増えすぎて大変になった
Schema Firstでは、問題点の解決の為に、多量のtoolが必要になった
では、元から色々サポートされているプログラミング言語の恩恵を受ければいいじゃない
言語の能力もあるし、IDEのサポートも既にある
という感じでCode Firstが出てきた
Nexusの例
code:ts
const Query = objectType('Query', t => {
t.string('hello', {
args: { name: stringArg() },
resolve: (_, { name }) => Hello ${name || World}!,
})
})
const schema = makeSchema({
outputs: {
schema: './schema.graphql'),
typegen: './typegen.ts',
},
})
TypeGraphQLの例
code:ts
@ObjectType()
class Recipe {
@Field(type => ID)
id: string;
@Field()
title: string;
ratings: Rate[];
@Field({ nullable: true })
averageRating?: number;
}
第1世代のCode Firstのように素のJS objectで書くのではなく、言語上のDSLで記述することでより簡潔に書ける